/**
 * Definici&oacute;n de espacio, componentes y funciones extras utilitarias de ExtJS
 * @class Extmx
 *
 * @singleton
 * @autor Ing. Josu� Hern�ndez G�mez<br>
 *        joshua@extjs.mx<br>
 *        http://www.joshua.com.mx
 * @fecha 08 de febrero 2010. Oaxaca, M&eacute;xico
 * 
 */
Ext.ns("Extmx");


Extmx.NUM_PAGINAS=50;


/**
 * Funci&oacute;n SINCRONA utilitaria para descargar asincronamente paquetes de JS.<br>
 * Al ser s&iacute;ncrona, la funci�n hace la solicitud del paquete y detiene el flujo del sistema hasta que este se descargue.
 * Esto asegura que debe ser descargado y evaluado completamente todo el JS antes de poder ser utilizado. <br><br>
 * La manera de estruturar un proyecto con EXTJS debe ser la siguiente.
 * - css
 * - imagenes
 * - js  <--- Obligatoriamente se debe definir toda la estructura de JS en esta carpeta. Por convenci&oacute;n
 *    / extjsmx
 *       - ext-all.js
 *    / miproyecto
 *       / usuarios
 *           - ComboBox.js
 * - otras<br><br>
 * De esta manera se tendr&iacute;a:
 * <pre><code>
	Extmx.include("miproyecto.usuarios.ComboBox");// representa el archivo /js/miproyecto/usuarios/ComboBox.js
 
var combo = new Ext.form.ComboBox({
	...
});
 * </code></pre>
 * La carpeta de referencia para Extmx.include siempre es <tt>/js</tt>. <br>
 * Ejemplos de uso de descargas:
 * <pre><code>
	Extmx.include("ext.ux.StatusBar");// representa el archivo /js/ext/ux/StatusBar.js
	Extmx.include("otroproject.sucursales.Window");// representa el archivo /js/otroproject/sucursales/Window.js
	
	Extmx.include("ext.ux.StatusBar", "otroproject.sucursales.Window");// descarga ambos archivos uno tras de otro
	
 * </code></pre>
 *  
 * @method include
 * @param {String} namespace1
 * @param {String} namespace2
 * @param {String} etc
*/
Extmx.include = function (){

	var prefix= "/js/";//TODO arguments[arguments.length-1] || "js/";
	
    if(!Ext.DESARROLLO)
        prefix= "/js/geckoscript/";
	
	for (var i = 0, len = arguments.length; i < len; i++) {
	//para cada uno de los parametros
		var filename = prefix+arguments[i];
		var filename= filename.replace(/[.]/g,"/");
		filename+=".js";
        Extmx.includePrefix= Extmx.includePrefix || "../..";
        Extmx.includeJS(Extmx.includePrefix+filename);
	}
}

Extmx.includeJS= function(filename){

    var globalEval=function (code) {
            if (window.execScript) {
                window.execScript(code, 'javascript');
            } else {
                var script = document.createElement('script');
                script.type = 'text/javascript';
                script.innerHTML = code;
                document.getElementsByTagName("head")[0].appendChild(script);
            }
    }

    if (Ext.isEmpty(Extmx.loaded))
			Extmx.loaded=[];

    if ( Extmx.loaded.indexOf(filename)==-1 ) {
        Extmx.loaded.push(filename);
        Extmx.getSincrono({
            url: filename,
            scope:this,
            success: function(d){
                globalEval(d);
            }
        });
    }
}

Extmx.getSincrono= function (obj){
    if (!this.request) {
            if (window.XMLHttpRequest) {
                    this.request = new XMLHttpRequest;
            } else {
                    if (window.ActiveXObject) {
                            try {
                                    this.request = new ActiveXObject("MSXML2.XMLHTTP");
                            }
                            catch (e) {
                                    this.request = new ActiveXObject("Microsoft.XMLHTTP");
                            }
                    }
            }
    }
    if (this.request) {
            this.request.open(obj.method || "GET", obj.url, false); // synchronous request!
            
            if(obj.method=="POST"){
                obj.params=Ext.urlEncode(obj.params||{});
                this.request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                this.request.setRequestHeader("Content-length", obj.params.length);
                this.request.setRequestHeader("Connection", "close");
            }
            
            this.request.send(obj.params ||null);
            if (this.request.status == 200) {
                    obj.success.call( obj.scope || this, this.request.responseText );
            }
    }
};


Date.prototype.toDMA= function (){
	return this.format("d-m-Y");
}

Date.prototype.toAMD= function (){
	return this.format("Y-m-d");
}


Extmx.crear= function (clase,obj){
    obj=obj || {}; 
    var cls;

    try{
        //intentar instanciar una clase de ese tipo
        eval("cls= "+clase+";");
        
        if(Ext.isEmpty(cls) || !Ext.isFunction(cls) )
        //si la funcion esta no esta definida o no es una funcion 
            throw "La clase no se ha descargado";
    }catch(e){    
        //si no se puede, descargarla e instanciarla
        Extmx.include(clase);
        eval("cls= "+clase+";");
    }
    return new cls(obj);
}